﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Clotho {

	/// <summary>
	/// Item 包或Plot和IFeature
	/// 可以从中找到主机
	/// 
	/// 
	/// 
	///	1. 子节点在构造函数中必须给与 Name 和 父节点。
	///	2. 节点属性更改全部使用命令更改。
	///	3. 节点复制需要提供新的父节点。
	/// </summary>
	public interface IItem {
		/// <summary>名字是Item的主键 </summary>
		string Name { get; set; }
		/// <summary>Nov是Item的最高储存结构，对于Plot就是其所在的novel，对于Feature，是其顶级Plot的Noval </summary>
		Novel Nov { get; }
		/// <summary>获取组件在Nov下的路径</summary>
		List<string> Path { get; }
		/// <summary>保存子组件的结构，如果没有子组件，则保持未初始化的状态 为Null</summary>
		List<IFeature> Features{ get; }
	}
	 static class IItem_expand {
		public static T getFeature<T>(this IItem item, string name) where T : IFeature {
			if (item.Features == null) { return null; }
			return item.Features.Find(f => ((f.Name == name) && (f is T))) as T;
		}

		static readonly string[] separator = { "-##-" };
		public static string getPathCmd(this IItem item) {
			return $"'{string.Join(separator[0], item.Path)}'";
		}
		public static IItem pathToItem(this Novel n, string str) {
			string[] ss = str.Split(separator,StringSplitOptions.None);
			if (ss.Length == 0) {
				return null;
			}
			IItem item = n[ss[0]];
			if (item == null) {
				return null;
			}
			int i = 1;
			while (true) {
				if (i >= ss.Length) {
					return item;
				}
				IItem next = item.getFeature<IFeature>(ss[i]);
				if (next == null) {
					return item;
				}
				item = next;
				i++;
			}
		}
	}
}
